<header>
    ArrayBuffer / TypedArray / DataView
</header>
<p>
    简单的说，ArrayBuffer就代表了内存中的一段二进制数据，不可以直接读写，只可以通过在上面建立TypedArray视图或DataView视图来操作这段二进制数据。
</p>
<p>
    TypedArray视图主要用来操作简单类型的二进制数据，DataView用来操作复杂类型的二进制数据。
</p>
<p>
    为了可以操作二进制数据，首先需要创建一个ArrayBuffer对象：
</p>
<pre tag="javascript">
    var arrayBuffer = new ArrayBuffer(length) //length代表长度，单位是字节
</pre>
<p>
    对象有了以后，就可以通过那两个视图进行操作了。
</p>
<h2>
    TypedArray视图
</h2>
<p>
    严格意义上来说，TypedArray视图应该是一类视图的统称，具体的有如下这些：
</p>
<ul>
    <li>
        nt8Array：8位有符号整数，长度1个字节
    </li>
    <li>
        Uint8Array：8位无符号整数，长度1个字节
    </li>
    <li>
        Uint8ClampedArray：8位无符号整数，长度1个字节，溢出处理不同
    </li>
    <li>
        Int16Array：16位有符号整数，长度2个字节
    </li>
    <li>
        Uint16Array：16位无符号整数，长度2个字节
    </li>
    <li>
        Int32Array：32位有符号整数，长度4个字节
    </li>
    <li>
        Uint32Array：32位无符号整数，长度4个字节
    </li>
    <li>
        Float32Array：32位浮点数，长度4个字节
    </li>
    <li>
        Float64Array：64位浮点数，长度8个字节
    </li>
</ul>
<p>
    他们只是数据格式不一样，操作上都一样，我们拿Int16Array和Int8Array举例子（非常类似普通的数组）：
</p>
<pre tag="javascript">
var arrayBuffer = new ArrayBuffer(6);//申请6个字节的内存空间

var int8Array = new Int8Array(arrayBuffer, 0, 2);//使用了2字节的空间
var int16Array = new Int16Array(arrayBuffer, 2, 2);//使用了4字节的空间

int8Array[0] = 1;
int16Array[0] = 2;
int16Array[1] = 3;

console.log(int8Array); //Int8Array(2) [1, 0]
console.log(int16Array); //Int16Array(2) [2, 3]
</pre>
<h2>
    DataView
</h2>
<p>
    这个就相对复杂一点了，毕竟这个是为操作复杂类型的二进制数据设计的。先看看语法：
</p>
<pre tag="javascript">
    var dataView = new DataView(ArrayBuffer实例对象[,字节起始位置[,长度]]);
</pre>
<p class="warn">
    温馨提示：和TypedArray有很大区别的是，这里我们在使用的时候可能要去关注一下大端还是小端保存或读取数据。
</p>
<p>
    如果说的简单点，其实DataView就是一个非常非常厉害视图，提供了很多方法，不像TypedArray视图需要建立对应视图然后读取，你可以调用DataView的实例对象上的方法就可以实现TypedArray哪些各种视图的功能。
</p>
<p>
    读数据的方法包括：getInt8、getUint8、getInt16、getUint16、getInt32、getUint32、getFloat32、getFloat64。
</p>
<p>
    写数据的方法包括：setInt8、setUint8、setInt16、setUint16、setInt32、setUint32、setFloat32、setFloat64。
</p>
<p>
    同样的，拿setInt16/getInt16和setInt8/getInt8举例子：
</p>
<pre tag="javascript">
var arrayBuffer = new ArrayBuffer(6);//申请6个字节的内存空间

var dataView = new DataView(arrayBuffer);// 建立读取对象

dataView.setInt8(0,1);
dataView.setInt16(2,2);
dataView.setInt16(4,3);

console.log(dataView.getInt8(0)); // 1
console.log(dataView.getInt16(2)); // 2
console.log(dataView.getInt16(4)); // 3
</pre>
<p class="warn">
    上面的所有方法最后都可以带一个布尔值，表示是大端(false)还是小端（true）。
</p>
<p>
    当然，你也可以试着运行下面这条语句：
</p>
<pre tag="javascript">
    console.log(dataView.getInt16(0)); // 256
</pre>
<p>
    为什么是256？因为你在第一个字节写入了1，第二个没有写，也就是0，而getInt16读取的是16位，也就是读取的二进制应该是：0000000100000000(2)=2<sup>8</sup><sub>(10)</sub>=256。
</p>